package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.ComprobantePercepcionDescuentoDAO;
import mx.ipn.persistencia.dao.PercepcionDAO;
import mx.ipn.persistencia.dao.PercepcionHistorialDAO;
import mx.ipn.to.ComprobantePercepcionDescuentoTO;
import mx.ipn.to.PercepcionHistorialTO;
import mx.ipn.to.PercepcionTO;

public class PercepcionHistorialDAOMySQL implements PercepcionHistorialDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(PercepcionHistorialDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO percepcion_historial(id_percepcion,id_comprobante,valor) VALUES(?,?,?)";
	private static final String UPDATE = "UPDATE percepcion_historial SET id_percepcion=?,id_comprobante=?,valor=? WHERE id_percepcion=? and id_comprobante=?";
	private static final String FINDBYPERCEPCIONCOMPROBANTE = "SELECT * FROM percepcion_historial WHERE id_percepcion=? and id_comprobante=?";
	private static final String SELECT = "SELECT * FROM percepcion_historial";
	private static final String SELECTBYRANGOVALOR = "SELECT * FROM percepcion_historial WHERE valor>=? AND valor<=?";
	private static final String SELECTBYPERCEPCION = "SELECT * FROM percepcion_historial WHERE id_percepcion=?";
	private static final String SELECTBYCOMPROBANTE = "SELECT * FROM percepcion_historial WHERE id_comprobante=?";

	@Override
	public PercepcionHistorialTO findPercepcionHistorialByPercepcionComprobante(
			int idPercepcion, int idComprobante) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYPERCEPCIONCOMPROBANTE);

			ps.setInt(1, idPercepcion);
			ps.setInt(2, idComprobante);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla TIPOEMPLEADO
				PercepcionDAO percepcionDAO = fabricaMySQL.getPercepcionDAO();
				ComprobantePercepcionDescuentoDAO comprobantePercepcionDescuentoDAO = fabricaMySQL
						.getComprobantePercepcionDescuentoDAO();

				ArrayList<ComprobantePercepcionDescuentoTO> listComprobantePercepcionDescuentoTO = new ArrayList<ComprobantePercepcionDescuentoTO>();
				ArrayList<PercepcionTO> listPercepcionTO = new ArrayList<PercepcionTO>();

				listPercepcionTO.add(percepcionDAO
						.findPercepcionById(idPercepcion));
				listComprobantePercepcionDescuentoTO
						.add(comprobantePercepcionDescuentoDAO
								.findComprobantePercepcionDescuentoById(idComprobante));
				double valor = rs.getDouble("valor");

				PercepcionTO[] arrPercepcionTO = (PercepcionTO[])listPercepcionTO.toArray(new PercepcionTO[listPercepcionTO.size()]);	
				ComprobantePercepcionDescuentoTO[] arrComprobantePercepcionDescuentoTO = (ComprobantePercepcionDescuentoTO[])listComprobantePercepcionDescuentoTO.toArray(new ComprobantePercepcionDescuentoTO[listComprobantePercepcionDescuentoTO.size()]);
				
				PercepcionHistorialTO percepcionHistorialTO = new PercepcionHistorialTO(
						arrPercepcionTO, arrComprobantePercepcionDescuentoTO,
						valor);

				ps.close();
				conexion.close();
				return percepcionHistorialTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertPercepcionHistorial(
			PercepcionHistorialTO percepcionHistorialTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setInt(1, percepcionHistorialTO.getIdPercepcion());
			ps.setInt(2, percepcionHistorialTO.getIdComprobante());
			ps.setDouble(3, percepcionHistorialTO.getValor());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<PercepcionHistorialTO> selectPercepcionHistorial() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			PercepcionDAO percepcionDAO = null;
			ComprobantePercepcionDescuentoDAO comprobantePercepcionDescuentoDAO = null;

			ArrayList<PercepcionHistorialTO> percepcionHistorialTO = null;
			PercepcionHistorialTO percepcionHistorialTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (percepcionHistorialTO == null) {
					percepcionHistorialTO = new ArrayList<PercepcionHistorialTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					percepcionDAO = fabricaMySQL.getPercepcionDAO();
					comprobantePercepcionDescuentoDAO = fabricaMySQL
							.getComprobantePercepcionDescuentoDAO();
				}

				int idPercepcion = rs.getInt("id_percepcion");
				int idComprobantePercepcionDescuento = rs
						.getInt("id_comprobante");
				double valor = rs.getDouble("valor");

				ArrayList<PercepcionTO> listPercepcionTO = new ArrayList<PercepcionTO>();
				ArrayList<ComprobantePercepcionDescuentoTO> listComprobantePercepcionDescuentoTO = new ArrayList<ComprobantePercepcionDescuentoTO>();

				listPercepcionTO.add(percepcionDAO
						.findPercepcionById(idPercepcion));
				listComprobantePercepcionDescuentoTO
						.add(comprobantePercepcionDescuentoDAO
								.findComprobantePercepcionDescuentoById(idComprobantePercepcionDescuento));

				PercepcionTO[] arrPercepcionTO = (PercepcionTO[])listPercepcionTO.toArray(new PercepcionTO[listPercepcionTO.size()]);	
				ComprobantePercepcionDescuentoTO[] arrComprobantePercepcionDescuentoTO = (ComprobantePercepcionDescuentoTO[])listComprobantePercepcionDescuentoTO.toArray(new ComprobantePercepcionDescuentoTO[listComprobantePercepcionDescuentoTO.size()]);
				
				percepcionHistorialTO2 = new PercepcionHistorialTO(
						arrPercepcionTO, arrComprobantePercepcionDescuentoTO,
						valor);

				percepcionHistorialTO.add(percepcionHistorialTO2);
			}
			ps.close();
			conexion.close();
			return percepcionHistorialTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public PercepcionHistorialTO selectPercepcionHistorialByComprobante(
			int idComprobante) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			PercepcionDAO percepcionDAO = null;
			ComprobantePercepcionDescuentoDAO comprobantePercepcionDescuentoDAO = null;

			ArrayList<ComprobantePercepcionDescuentoTO> listComprobantePercepcionDescuentoTO = null;
			ArrayList<PercepcionTO> listPercepcionTO = null;
			ArrayList<Double> listValor = null;

			PercepcionHistorialTO percepcionHistorialTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYCOMPROBANTE);
			ps.setInt(1, idComprobante);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listComprobantePercepcionDescuentoTO == null) {

					listPercepcionTO = new ArrayList<PercepcionTO>();
					listComprobantePercepcionDescuentoTO = new ArrayList<ComprobantePercepcionDescuentoTO>();
					listValor = new ArrayList<Double>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					comprobantePercepcionDescuentoDAO = fabricaMySQL
							.getComprobantePercepcionDescuentoDAO();
					percepcionDAO = fabricaMySQL.getPercepcionDAO();
				}

				listPercepcionTO.add(percepcionDAO.findPercepcionById(rs
						.getInt("id_percepcion")));
				listValor.add(rs.getDouble("valor"));

			}
			if (listPercepcionTO != null) {

				listComprobantePercepcionDescuentoTO
						.add(comprobantePercepcionDescuentoDAO
								.findComprobantePercepcionDescuentoById(idComprobante));
				
				PercepcionTO[] arrPercepcionTO = (PercepcionTO[])listPercepcionTO.toArray(new PercepcionTO[listPercepcionTO.size()]);	
				ComprobantePercepcionDescuentoTO[] arrComprobantePercepcionDescuentoTO = (ComprobantePercepcionDescuentoTO[])listComprobantePercepcionDescuentoTO.toArray(new ComprobantePercepcionDescuentoTO[listComprobantePercepcionDescuentoTO.size()]);
				Double[] arrValor = (Double[])listValor.toArray(new Double[listValor.size()]);
				
				percepcionHistorialTO = new PercepcionHistorialTO(
						arrPercepcionTO, arrComprobantePercepcionDescuentoTO,
						arrValor);

			}
			ps.close();
			conexion.close();
			return percepcionHistorialTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public PercepcionHistorialTO selectPercepcionHistorialByPercepcion(
			int idPercepcion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			PercepcionDAO percepcionDAO = null;
			ComprobantePercepcionDescuentoDAO comprobantePercepcionDescuentoDAO = null;

			ArrayList<ComprobantePercepcionDescuentoTO> listComprobantePercepcionDescuentoTO = null;
			ArrayList<PercepcionTO> listPercepcionTO = null;
			ArrayList<Double> listValor = null;

			PercepcionHistorialTO percepcionHistorialTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYPERCEPCION);
			ps.setInt(1, idPercepcion);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listPercepcionTO == null) {

					listPercepcionTO = new ArrayList<PercepcionTO>();
					listComprobantePercepcionDescuentoTO = new ArrayList<ComprobantePercepcionDescuentoTO>();
					listValor = new ArrayList<Double>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					comprobantePercepcionDescuentoDAO = fabricaMySQL
							.getComprobantePercepcionDescuentoDAO();
					percepcionDAO = fabricaMySQL.getPercepcionDAO();
				}

				listComprobantePercepcionDescuentoTO
						.add(comprobantePercepcionDescuentoDAO
								.findComprobantePercepcionDescuentoById(rs
										.getInt("id_comprobante")));
				listValor.add(rs.getDouble("valor"));

			}
			if (listPercepcionTO != null) {

				listPercepcionTO.add(percepcionDAO.findPercepcionById(idPercepcion));

				PercepcionTO[] arrPercepcionTO = (PercepcionTO[])listPercepcionTO.toArray(new PercepcionTO[listPercepcionTO.size()]);	
				ComprobantePercepcionDescuentoTO[] arrComprobantePercepcionDescuentoTO = (ComprobantePercepcionDescuentoTO[])listComprobantePercepcionDescuentoTO.toArray(new ComprobantePercepcionDescuentoTO[listComprobantePercepcionDescuentoTO.size()]);
				Double[] arrValor = (Double[])listValor.toArray(new Double[listValor.size()]);
				
				percepcionHistorialTO = new PercepcionHistorialTO(
						arrPercepcionTO, arrComprobantePercepcionDescuentoTO,
						arrValor);
			}
			ps.close();
			conexion.close();
			return percepcionHistorialTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<PercepcionHistorialTO> selectPercepcionHistorialByRangoValor(
			double inicio, double fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			PercepcionDAO percepcionDAO = null;
			ComprobantePercepcionDescuentoDAO comprobantePercepcionDescuentoDAO = null;

			ArrayList<PercepcionHistorialTO> percepcionHistorialTO = null;
			PercepcionHistorialTO percepcionHistorialTO2 = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOVALOR);

			ps.setDouble(1, inicio);
			ps.setDouble(2, fin);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (percepcionHistorialTO == null) {
					percepcionHistorialTO = new ArrayList<PercepcionHistorialTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					percepcionDAO = fabricaMySQL.getPercepcionDAO();
					comprobantePercepcionDescuentoDAO = fabricaMySQL
							.getComprobantePercepcionDescuentoDAO();
				}

				int idPercepcion = rs.getInt("id_percepcion");
				int idComprobantePercepcionDescuento = rs
						.getInt("id_comprobante");
				double valor = rs.getDouble("valor");

				ArrayList<PercepcionTO> listPercepcionTO = new ArrayList<PercepcionTO>();
				ArrayList<ComprobantePercepcionDescuentoTO> listComprobantePercepcionDescuentoTO = new ArrayList<ComprobantePercepcionDescuentoTO>();

				listPercepcionTO.add(percepcionDAO
						.findPercepcionById(idPercepcion));
				listComprobantePercepcionDescuentoTO
						.add(comprobantePercepcionDescuentoDAO
								.findComprobantePercepcionDescuentoById(idComprobantePercepcionDescuento));

				PercepcionTO[] arrPercepcionTO = (PercepcionTO[])listPercepcionTO.toArray(new PercepcionTO[listPercepcionTO.size()]);	
				ComprobantePercepcionDescuentoTO[] arrComprobantePercepcionDescuentoTO = (ComprobantePercepcionDescuentoTO[])listComprobantePercepcionDescuentoTO.toArray(new ComprobantePercepcionDescuentoTO[listComprobantePercepcionDescuentoTO.size()]);

				percepcionHistorialTO2 = new PercepcionHistorialTO(
						arrPercepcionTO, arrComprobantePercepcionDescuentoTO,
						valor);

				percepcionHistorialTO.add(percepcionHistorialTO2);
			}
			ps.close();
			conexion.close();
			return percepcionHistorialTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updatePercepcionHistorial(
			PercepcionHistorialTO percepcionHistorialTO,
			PercepcionHistorialTO percepcionHistorialTONuevo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, percepcionHistorialTONuevo.getIdPercepcion());
			ps.setInt(2, percepcionHistorialTONuevo.getIdComprobante());
			ps.setDouble(3, percepcionHistorialTONuevo.getValor());
			ps.setInt(4, percepcionHistorialTO.getIdPercepcion());
			ps.setInt(5, percepcionHistorialTO.getIdComprobante());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
